﻿using System;
using System.Collections.Generic;
using Sebrae.Academico.Trilhas.BM.Classes;
using Sebrae.Academico.Trilhas.Dominio.Classes;

namespace Sebrae.Academico.Trilhas.BP
{
    public class ManterItemTrilha : BusinessProcessBase
    {
        private BMItemTrilha pRepositorio = null;

        /// <summary>
        /// Método Construtor da classe
        /// </summary>
        public ManterItemTrilha()
            : base() { }

        public void Incluir(ItemTrilha pItemTrilha)
        {
            pRepositorio = new BMItemTrilha(unitOfWork);
            ValidariItemTrilhaInformado(pItemTrilha);
            pRepositorio.Incluir(pItemTrilha);
        }

        /// <summary>
        /// Validação das informações de um Item de uma Trilha.
        /// </summary>
        /// <param name="pItemTrilha"></param>
        private void ValidariItemTrilhaInformado(ItemTrilha pItemTrilha)
        {
            pRepositorio.ValidarInstancia(pItemTrilha);

            //Verifica se a trilha está nula
            if (pItemTrilha.Trilha == null) throw new Exception("Trilha. Campo Obrigatório");

            //Verifica se o nivel da trilha está nulo
            if (pItemTrilha.TrilhaNivel == null) throw new Exception("Nível da Trilha. Campo Obrigatório");

            //Verifica se a forma de aprendizagem está nula
            if (pItemTrilha.TrilhaFormaAprendizagem == null) throw new Exception("Forma de Aprendizagem. Campo Obrigatório");

            //Verifica se a solução educacional está nula
            if (pItemTrilha.SolucaoEducacional == null) throw new Exception("Solução Educacional. Campo Obrigatório");

            //Verifica se o Tópico Temático está nulo
            if (pItemTrilha.TrilhaTopicoTematico == null) throw new Exception("Tópico Temático. Campo Obrigatório");

            //Pontos
            if (pItemTrilha.QuantidadePontosParticipacao <= 0) throw new Exception("Valor Inválido para o Campo Pontos. Informe um Valor entre 1 e 9");

        }

        public void Alterar(ItemTrilha pItemTrilha)
        {
            pRepositorio = new BMItemTrilha(unitOfWork);
            ValidariItemTrilhaInformado(pItemTrilha);
            pRepositorio.Alterar(pItemTrilha);
        }

        public IList<ItemTrilha> ObterTodos()
        {
            pRepositorio = new BMItemTrilha(unitOfWork);
            return pRepositorio.ObterTodos();
        }

        public ItemTrilha ObterPorID(int pId)
        {
            pRepositorio = new BMItemTrilha(unitOfWork);
            return pRepositorio.ObterPorID(pId);
        }

        public void Excluir(ItemTrilha pItemTrilha)
        {
            pRepositorio = new BMItemTrilha(unitOfWork);
            pRepositorio.ValidarInstancia(pItemTrilha);

            //Todo: -> Implmentar as verificacoes de dependencias antes de excluir
            //(verificar se existem dependencias)
            pRepositorio.Excluir(pItemTrilha);
        }

        public IList<ItemTrilha> ObterPorFiltro(ItemTrilha pItemTrilha)
        {
            pRepositorio = new BMItemTrilha(unitOfWork);
            pRepositorio.ValidarInstancia(pItemTrilha);
            return pRepositorio.ObterPorFiltro(pItemTrilha);
        }

    }
}
